from openai import OpenAI
import logging
from typing import Dict, Any
from config import settings

class ThreeDGGBGenerationAPI:
    def __init__(self):
        self.client = OpenAI(
            api_key=settings.deepseek_api_key,
            base_url=settings.deepseek_base_url,
        )
        
        self.system_prompt = '''<身份>
你是一名擅长数学和GeoGebra命令代码的AI助手，能够根据传入的数学元素写出绘制它们的GeoGebra 3D指令并以规定格式列出。
</身份>

<关键要求>
1. **完整性要求**：
   - 必须包含第一步提取的所有数学元素（点/线/图形等），不得遗漏
   - 每个元素必须有明确的GeoGebra 3D定义语句
   - 隐藏元素显式定义后设置隐藏（如`SetVisibleInView(H, false)`）

2. **3D几何关系约束**：
   - 当点间有固定关系时：
     - 使用动态坐标语法（`N = (x(M), y(M), z_value)`）
     - 禁止定义静态独立坐标
   - 存在多种情况时（如分类讨论）：
     - 每种情况分别定义
     - 使用带数字后缀变量名（如M1, M2...）

3. **可移动点标记**：
   - 在点定义后添加注释`#movable`标记可移动点
   - 示例：`M1 = (-3, -3.5, 2)  #movable`

4. **3D渲染保障**：
   - 所有3D图形必须通过点构造（如`Polygon3D(A,B,C,D)`）
   - 使用3D命令如`Plane()`, `Sphere()`, `Cylinder()`, `Pyramid()`等
</关键要求>

<输出格式>
### 1. 点（Points）
   - **A点**：`A = (-2, 0, 1)`
   - **M点**（三种情况）：
     - `M1 = (-3, -3.5, 2)  #movable`
     - `M2 = (3, 2.5, 1)    #movable`
     - `M3 = (5, -3.5, 0)   #movable`

### 2. 直线（Lines）
   - **直线AB**：`lineAB: Line(A, B)`
   - **Z轴**：`zAxis: Line((0,0,0), (0,0,1))`

### 3. 平面（Planes）
   - **平面ABC**：`planeABC = Plane(A, B, C)`

### 4. 立体图形（3D Shapes）
   - **立方体**：`cube = Cube(A, B)`
   - **球体**：`sphere = Sphere(center, radius)`

### 其他辅助指令
   - **依赖更新**：`SetDynamicColor(cube, "blue")`
   - **隐藏辅助点**：`SetVisibleInView(H, false)`
</输出格式>'''

        logging.basicConfig(
            filename="threed_ggb_generation_api.log",
            level=logging.INFO,
            format="%(asctime)s - %(levelname)s - %(message)s"
        )

    async def generate_ggb(self, threed_elements: str) -> Dict[str, Any]:
        """
        Generate GeoGebra 3D commands from extracted elements
        """
        try:
            logging.info(f"Generating 3D GGB commands for elements: {threed_elements[:100]}...")
            
            response = self.client.chat.completions.create(
                model=settings.deepseek_v3_model,
                messages=[
                    {"role": "system", "content": self.system_prompt},
                    {"role": "user", "content": threed_elements},
                ],
                stream=False
            )
            
            commands = response.choices[0].message.content
            logging.info(f"Generated 3D GGB commands: {commands}")
            
            return {
                "commands": commands,
                "success": True
            }
            
        except Exception as e:
            logging.error(f"Error in generate_ggb: {str(e)}")
            return {
                "commands": "",
                "success": False,
                "error": str(e)
            } 